package wangwenjun.phase1.flightquery.latch.v1;

/**
 * @author ChangLiang
 * @date 2020/6/16
 */
public class CountDownLatchV1 extends LatchV1 {
    public CountDownLatchV1(int limit) {
        super(limit);
    }

    @Override
    public void await() throws InterruptedException {
        synchronized (this) {
            /**
             * await（）方法不断判断limit 的数量，大于0 时将不能打开，需要持
             * 续等待直到limit 数量为0 为止
             */
            while (limit > 0) {
                this.wait();
            }
        }
    }

    @Override
    public void countDown() {
        synchronized (this) {
            if (limit <= 0) {
                throw new IllegalArgumentException("all of task has already arrived");
            }
            /**
             * countDown（）方法调用之后会导致limit-- 操作， 并且通知
             * wait 中的线程再次判断limit 的值是否等于0
             */
            limit--;
            this.notifyAll();
        }
    }

    @Override
    public int getUnArrived() {
        /**
         * 这个返回值并不一定就是准确的，在多线程的情况下， 某个线程在获得UnArrived 任务数量并且返回之后， 有可能limit
         * 又被减少，因此getUnarrived是一个评估值
         */
        return limit;
    }
}
